﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ArgosMembership.Modelo;
using ArgosMembership.Componentes;
using ArgosMembership.Contexto;

namespace ArgosMembership.Componentes
{
    public class AdministradorUsuario
    {
        public static int Agregar(Usuario usuario)
        {

            if (string.IsNullOrWhiteSpace(usuario.Nombre.Trim()))
                throw new SMException("Se debe especificar el nombre del contacto");

            if (string.IsNullOrWhiteSpace(usuario.UserName.Trim()))
                throw new SMException("Se debe especificar el usuario del contacto");

            if (string.IsNullOrWhiteSpace(usuario.Telefono.Trim()))
                throw new SMException("Se debe especificar el teléfono del contacto");

            if (string.IsNullOrWhiteSpace(usuario.Correo.Trim()))
                throw new SMException("Se debe especificar el correo del contacto");

            if (!ExisteCuenta(usuario.UserName))
                throw new SMException("Esa cuenta de usuario ya existe");

            SecureModel capaDatos = null;
            try
            {
                string saltPassword = usuario.UserName + "|" + usuario.Password;
                capaDatos = new SecureModel();
                //Encrtiptar la contraseña antes de guardarlo
                usuario.Password = Encripcion.Encripta(saltPassword);
                capaDatos.Usuarios.Add(usuario);
                capaDatos.SaveChanges();
            }
            finally
            {
                if (capaDatos != null)
                    capaDatos.Dispose();
                capaDatos = null;
            }
            return usuario.Id;
        }

        public static bool ExisteCuenta(string cuenta)
        {
            Usuario usuario = Obtener(cuenta);
            bool resultado = false;

            if (usuario != null)
                resultado = false;
            else
                resultado = true;

            usuario = null;
            return resultado;
        }

        public static Usuario Obtener(int valor)
        {
            SecureModel capaDatos = null;
            Usuario usuario;
            try
            {
                capaDatos = new SecureModel();
                usuario = capaDatos.Usuarios.Find(valor);

            }
            finally
            {
                if (capaDatos != null)
                    capaDatos.Dispose();
                capaDatos = null;
            }
            return usuario;
        }

        public static Usuario Obtener(string userName)
        {
            SecureModel capaDatos = null;
            Usuario usuario;
            try
            {
                capaDatos = new SecureModel();
                usuario = capaDatos.Usuarios.FirstOrDefault(x => x.UserName == userName);

            }
            finally
            {
                if (capaDatos != null)
                    capaDatos.Dispose();
                capaDatos = null;
            }
            return usuario;
        }

        public static int ObtenerId(string correo)
        {
            SecureModel capaDatos = null;
            Usuario usuario;
            try
            {
                capaDatos = new SecureModel();
                usuario = capaDatos.Usuarios.First(x => x.Correo == correo);

            }
            finally
            {
                if (capaDatos != null)
                    capaDatos.Dispose();
                capaDatos = null;
            }
            return usuario.Id;
        }

        public static bool Eliminar(int valor)
        {
            SecureModel capaDatos = null;
            Usuario usuario;
            bool resultado = false;
            try
            {
                capaDatos = new SecureModel();
                usuario = capaDatos.Usuarios.Find(valor);
                capaDatos.Usuarios.Remove(usuario);
                resultado = capaDatos.SaveChanges() > 0;
            }
            finally
            {
                if (capaDatos != null)
                    capaDatos.Dispose();
                capaDatos = null;
            }
            return resultado;
        }

        public static List<Usuario> Listar()
        {
            SecureModel capaDatos = null;
            List<Usuario> usuarios = new List<Usuario>();
            try
            {
                capaDatos = new SecureModel();
                usuarios = capaDatos.Usuarios.ToList();
            }
            finally
            {
                if (capaDatos != null)
                    capaDatos.Dispose();
                capaDatos = null;
            }
            return usuarios;
        }

        public static bool CambiaPassoword(int Id, string NuevoPassword)
        {
            if (string.IsNullOrWhiteSpace(NuevoPassword))
                throw new SMException("Debe proporcionar una nueva contraseña");

            SecureModel capaDatos = null;
            Usuario usuario;
            bool resultado = false;
            try
            {
                capaDatos = new SecureModel();
                usuario = capaDatos.Usuarios.Find(Id);
                string saltPassword = usuario.UserName + "|" + usuario.Password;
                usuario.Password = Encripcion.Encripta(saltPassword);

                resultado = capaDatos.SaveChanges() > 0;

            }
            finally
            {
                if (capaDatos != null)
                    capaDatos.Dispose();
                capaDatos = null;
            }
            return resultado;
        }
    }
}
